/*
* The MIT License
*
* Copyright (c) 2015, CloudBees, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.jenkinsci.plugins.cucumber.jsontestsupport;
import java.net.URL;
import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition;
import org.jenkinsci.plugins.workflow.job.WorkflowJob;
import org.jenkinsci.plugins.workflow.job.WorkflowRun;
import org.jenkinsci.plugins.workflow.test.steps.SemaphoreStep;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.Issue;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.SingleFileSCM;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import hudson.model.FreeStyleBuild;
import hudson.model.FreeStyleProject;
import hudson.model.Job;
import hudson.model.Node;
import hudson.model.Result;
import hudson.model.Run;
import hudson.slaves.DumbSlave;
import jenkins.model.Jenkins;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.core.StringContains.containsString;
import static org.hamcrest.core.AllOf.allOf;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
public class CucumberJSONSupportPluginIT {
@Rule
public JenkinsRule jenkinsRule = new JenkinsRule();
JenkinsRule.WebClient wc;
@Test
@Issue("JENKINS-28588")
public void testSerializationOnSlave() throws Exception {
DumbSlave slave = jenkinsRule.createOnlineSlave();
SingleFileSCM scm = new SingleFileSCM("test.json",
getResource("passWithEmbeddedItem.json")
.toURI().toURL());
FreeStyleProject project = jenkinsRule.createFreeStyleProject("cucumber-plugin-IT");
project.setAssignedNode(slave);
project.setScm(scm);
CucumberTestResultArchiver resultArchiver = new CucumberTestResultArchiver("test.json");
project.getPublishersList().add(resultArchiver);
project.save();
FreeStyleBuild build = jenkinsRule.buildAndAssertSuccess(project);
jenkinsRule.assertLogContains("test.json", build);
// check we built on the slave not the master...
assertThat("Needs to build on the salve to check serialization", build.getBuiltOn(), is((Node) slave));
}
@Test
@Issue("JENKINS-26340")
public void testMergeStability() throws Exception {
WorkflowJob job = jenkinsRule.jenkins.createProject(WorkflowJob.class, "merge1");
job.setDefinition(new CpsFlowDefinition("node {\n" +
" writeFile file: 'pass.json', text: '''" +
getResourceAsString("featurePass.json") +
" '''\n" +
" step($class: 'CucumberTestResultArchiver', testResults: 'pass.json')\n" +
"}\n" +
"semaphore 'wait'\n" +
"node {\n" +
" writeFile file: 'fail.json', text: '''" +
getResourceAsString("featureFail.json") +
" '''\n" +
" step($class: 'CucumberTestResultArchiver', testResults: 'fail.json')\n" +
"}"));
WorkflowRun r1 = job.scheduleBuild2(0).getStartCondition().get();
// until after the first parsing has occurred.
SemaphoreStep.waitForStart("wait/1", r1);
assertTrue(JenkinsRule.getLog(r1), r1.isBuilding());
// check the scenario is 1 passing
wc = jenkinsRule.createWebClient();
HtmlPage htmlPage = wc.getPage(r1, "cucumberTestReport/foo-feature");
assertThat(htmlPage.asText(), containsString("0 failures"));
// resume the build
SemaphoreStep.success("wait/1", true);
jenkinsRule.waitForCompletion(r1);
// check the scenario is 1 passing and 1 failing
Jenkins.getInstance().reload();
wc = jenkinsRule.createWebClient();
htmlPage = wc.getPage(r1, "cucumberTestReport/foo-feature");
assertThat(htmlPage.asText(), containsString("0 failures"));
htmlPage = wc.getPage(r1, "cucumberTestReport/foo-feature_2");
assertThat(htmlPage.asText(), containsString("1 failures"));
// check the build is unstable
jenkinsRule.assertBuildStatus(Result.UNSTABLE, r1);
}
@Test
@Issue("JENKINS-26340")
public void testMergeStability2() throws Exception {
WorkflowJob job = jenkinsRule.jenkins.createProject(WorkflowJob.class, "merge2");
job.setDefinition(new CpsFlowDefinition("node {\n" +
" writeFile file: 'fail.json', text: '''" +
getResourceAsString("featureFail.json") +
" '''\n" +
" step($class: 'CucumberTestResultArchiver', testResults: 'fail.json')\n" +
"}\n" +
"semaphore 'wait'\n" +
"node {\n" +
" writeFile file: 'pass.json', text: '''" +
getResourceAsString("featurePass.json") +
" '''\n" +
" step($class: 'CucumberTestResultArchiver', testResults: 'pass.json')\n" +
"}"));
WorkflowRun r1 = job.scheduleBuild2(0).getStartCondition().get();
// until after the first parsing has occurred.
SemaphoreStep.waitForStart("wait/1", r1);
assertTrue(JenkinsRule.getLog(r1), r1.isBuilding());
// check the scenario is 1 failing
wc = jenkinsRule.createWebClient();
HtmlPage htmlPage = wc.getPage(r1, "cucumberTestReport/foo-feature");
assertThat(htmlPage.asText(), containsString("1 failures"));
// resume the build
SemaphoreStep.success("wait/1", true);
jenkinsRule.waitForCompletion(r1);
// check the scenario is 1 passing and 1 failing
Jenkins.getInstance().reload();
wc = jenkinsRule.createWebClient();
htmlPage = wc.getPage(r1, "cucumberTestReport/foo-feature");
assertThat(htmlPage.asText(), containsString("1 failures"));
htmlPage = wc.getPage(r1, "cucumberTestReport/foo-feature_2");
assertThat(htmlPage.asText(), containsString("0 failures"));
// check the build is failure
jenkinsRule.assertBuildStatus(Result.FAILURE, r1);
}
@Test
public void testSymbol() throws Exception {
WorkflowJob job = jenkinsRule.jenkins.createProject(WorkflowJob.class, "symbol");
job.setDefinition(new CpsFlowDefinition("node {\n" +
" writeFile file: 'pass.json', text: '''" +
getResourceAsString("featurePass.json") +
" '''\n" +
" cucumber 'pass.json'\n" +
"}"));
Run r1 = jenkinsRule.buildAndAssertSuccess((Job)job);
// check the scenario is 1 passing
wc = jenkinsRule.createWebClient();
HtmlPage htmlPage = wc.getPage(r1, "cucumberTestReport/foo-feature");
assertThat(htmlPage.asText(), allOf(containsString("1 tests"), containsString("0 failures")));
}
private static URL getResource(String resource) throws Exception {
URL url = CucumberJSONSupportPluginIT.class.getResource(CucumberJSONSupportPluginIT.class.getSimpleName() + "/" + resource);
Assert.assertNotNull("Resource " + resource + " could not be found", url);
return url;
}
private static String getResourceAsString(String resource) throws Exception {
URL url = getResource(resource);
return org.apache.commons.io.IOUtils.toString(url);
}
}